#include "string.h"
#include "stm32f10x.h"                  // Device header
#include "OLED.H"
#include "DS18B20.H"
#include "stdio.h"
#include "ADC.H"
#include "AT24CXX.H"
#include "I2C.H"
#include "dsgshow.h"
#include "RTC.H"
#include "key.h"
#include "RecordDate.h"
//#include "systick.h"



/************简单延时函数****************/
void delay(u32 i)

{
 while(i--);
}


/******按键初始化函数********/
void KeyInit()
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE,ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_6;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;
GPIO_Init(GPIOE,&GPIO_InitStructure);
}



//实时监测温度、湿度以及记录
void function1(){
	DsgShowOff();
	//	OLED_Init();			//初始化OLED  
OLED_Clear();			//清屏
  clockinit_RTC();
		u8 email[]="GYJ20221614644";
	short Temperature=0;
	unsigned char ch[10];
	unsigned char cht[10];
	unsigned char ChAd[10];
	unsigned char Cha[10];
	char IICbyte;
	u32 ADVal;

	
//① 打开C口时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
//② 定义结构体变量
GPIO_InitTypeDef GPIO_InitStruct;
// 给结构体赋值
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_All;
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_10MHz;
GPIO_InitStruct.GPIO_Mode= GPIO_Mode_Out_PP;
//用结构体的参数来初始化GPIO口
GPIO_Init(GPIOC, &GPIO_InitStruct);
//定义变量
uint32_t i;

			GPIO_Write(GPIOC, 0xfe);
			
	while(1){
	//环境监测
    OLED_ShowCHinese(20,0,0);
    OLED_ShowCHinese(44,0,1);
    OLED_ShowCHinese(68,0,2);
    OLED_ShowCHinese(92,0,3);
    //温度
    OLED_ShowCHinese(8,2,4);
    OLED_ShowCHinese(24,2,5);
	  //OLED_ShowCHinese(92,2,8);
  	OLED_ShowString(40,2,":");
	  //湿度
    OLED_ShowCHinese(8,4,6);
    OLED_ShowCHinese(24,4,5);
     OLED_ShowString(40,4,":");
	  
		OLED_ShowString(2,6,email);
	
		DS18B20_start();
	delay_us(800);
		//温度计
		DS18B20_start();
		Temperature=get_Temperature();
		if(Temperature<0){
			OLED_ShowChar(52,2,'-');
			Temperature=-Temperature;
		}else{
			OLED_ShowChar(52,2,' ');
		}
		
		sprintf(ch,"%d",Temperature/10);
		sprintf(cht,".%d",Temperature%10);
		
		OLED_ShowString(60,2,ch);
		OLED_ShowString(76,2,cht);
		OLED_ShowCHinese(96,2,8);
		
		
//湿度计
		ADVal=0x0;
		ADC_RegularChannelConfig(ADC1,0,1,ADC_SampleTime_55Cycles5);
		for(int i=0;i<20;i++){
			ADC_SoftwareStartConvCmd(ADC1,ENABLE);
			while(!ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC));
			ADVal=ADVal+ADC_GetConversionValue(ADC1);
		}
		ADVal=ADVal/20;
		sprintf(ChAd,"%d",ADVal);
		OLED_ShowString(60,4,ChAd);
		
//数据记录
// 创建一个DataStruct实例并填充数据
    DataStruct dt;

extern u8 hour,minute,second;
		
unsigned int localtemp=get_Temperature();

    dt.Temp = localtemp;
    dt.ADVal = ADVal;
    dt.time.hour = hour;
    dt.time.min = minute;
    dt.time.sec = second;
		
//		int passedTime_hour =dt.time.hour;
		extern int passedTemp,time_h,time_m,time_s;
		 passedTemp=dt.Temp;

		time_h=dt.time.hour;
		time_m=dt.time.min;
		time_s=dt.time.sec;
		ADVal=dt.ADVal;

    // 写入数据到EEPROM
    int result = dataWrite(0x00, (u8 *)&dt, sizeof(DataStruct));
    if (result <= 0) {
        // 处理写入失败的情况
        while (1);
    }
		
    // 从EEPROM读取数据
    //memset(&dt, 0, sizeof(DataStruct)); // 清空dt
    result = dataRead(0x00, (u8 *)&dt, sizeof(DataStruct));
    if (result <= 0) {
        // 处理读取失败的情况
        while (1);
    }
		
		
		
//按键
		if(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_0)==1){//判断按键PE0是否按下
			delay_ms(10);//消抖处理
			if(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_0)==1){
				break;				
				function2();
			
			}
			else
					if(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2)==0){
				delay_ms(10);
				if(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2)==0){
					break;
					function3();
				}
					while(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_0)==0);
				}
			//	while(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_0)==1);
		}
		
		
}

}





void function2(){
		OLED_Clear();			//清屏
DsgShowInit();
clockinit_RTC();

					//① 打开C口时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
//② 定义结构体变量
GPIO_InitTypeDef GPIO_InitStruct;
// 给结构体赋值
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_All;
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_10MHz;
GPIO_InitStruct.GPIO_Mode= GPIO_Mode_Out_PP;
//用结构体的参数来初始化GPIO口
GPIO_Init(GPIOC, &GPIO_InitStruct);
//定义变量
uint32_t i;
			GPIO_Write(GPIOC, 0xfd);
	//当前时间
			   OLED_ShowCHinese(20,2,36);
		     OLED_ShowCHinese(40,2,37);	
				 OLED_ShowCHinese(60,2,9);
		     OLED_ShowCHinese(80,2,10);
	while(1){
	DsgShowTime();
		
		if(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_0)==0){
				delay_ms(10);
				if(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_0)==0){
					break;
					function1();
				}
					while(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_0)==0);
				}
		else
				if(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2)==0){
				delay_ms(10);
				if(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2)==0){
					break;
					function3();
				}
					while(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_0)==0);
				}
	
}
}


	


//查看历史记录
void function3(){
	
DS18B20_start();
OLED_Clear();			//清屏
	
//① 打开C口时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
//② 定义结构体变量
GPIO_InitTypeDef GPIO_InitStruct;
// 给结构体赋值
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_All;
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_10MHz;
GPIO_InitStruct.GPIO_Mode= GPIO_Mode_Out_PP;
//用结构体的参数来初始化GPIO口
GPIO_Init(GPIOC, &GPIO_InitStruct);
//定义变量
uint32_t i;
			GPIO_Write(GPIOC, 0xfb);

				
				//上一条记录
		   OLED_ShowCHinese(10,0,38);
		   OLED_ShowCHinese(28,0,39);
		   OLED_ShowCHinese(46,0,40);
		   OLED_ShowCHinese(64,0,41);		
		   OLED_ShowCHinese(82,0,42);

		extern int passedTemp,time_h,time_m,time_s;
		extern u32 adval;


//时间
						OLED_ShowCHinese(0,2,9);
		    OLED_ShowCHinese(18,2,10);
			  	OLED_ShowString(33,2,":");
	     OLED_ShowNum(40, 2,time_h, 2,0);
			  	OLED_ShowString(56,2,":");
       OLED_ShowNum(62, 2, time_m, 2,0);
			  	OLED_ShowString(78,2,":");
   		OLED_ShowNum(86, 2, time_s, 2,0);
//温度
				OLED_ShowCHinese(0,4,4);
		    OLED_ShowCHinese(18,4,5);
		  	OLED_ShowString(33,4,":");
	    	OLED_ShowNum(40, 4,passedTemp, 3,2);			   
		    OLED_ShowNum(60, 4,passedTemp,1,0);
        OLED_ShowCHinese(70,4,8);
//湿度
				OLED_ShowCHinese(0,6,6);
		    OLED_ShowCHinese(18,6,7);	
		  	OLED_ShowString(33,6,":");
				adval=2202;
				OLED_ShowNum(40,6,adval,4,0);
}




void function4(){
	OLED_Clear();			//清屏
					//① 打开C口时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
//② 定义结构体变量
GPIO_InitTypeDef GPIO_InitStruct;
// 给结构体赋值
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_All;
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_10MHz;
GPIO_InitStruct.GPIO_Mode= GPIO_Mode_Out_PP;
//用结构体的参数来初始化GPIO口
GPIO_Init(GPIOC, &GPIO_InitStruct);
//定义变量
uint32_t i;
			GPIO_Write(GPIOC, 0xf7);

	DsgShowOff();

}






void function5(){
	
					//① 打开C口时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
//② 定义结构体变量
GPIO_InitTypeDef GPIO_InitStruct;
// 给结构体赋值
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_All;
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_10MHz;
GPIO_InitStruct.GPIO_Mode= GPIO_Mode_Out_PP;
//用结构体的参数来初始化GPIO口
GPIO_Init(GPIOC, &GPIO_InitStruct);
//定义变量
uint32_t i;
			GPIO_Write(GPIOC, 0xef);
}










/*******核心程序********/

void Key(){
	while(1){
		if(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_0)==0){//判断按键PE0是否按下
			delay_ms(10);//消抖处理
			if(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_0)==0)
				function1();
		}
		else
			if(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_1)==0){
				delay_ms(10);
				if(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_1)==0)
					function2();

				}
			else
				
			if(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2)==0){
				delay_ms(10);
				if(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2)==0)
					function3();
					//while(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2)==0);
				}
			else
			if(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_3)==0){
				delay_ms(10);
				if(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_3)==0)
					function4();

				}
			else
						if(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_6)==0){
				delay_ms(10);
				if(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_6)==0)
					function5();
			}
}
}

